/**
 * @file
 * @author dousha
 * @date 2020
 */

#include <stm32f4xx.h>
#include <core_cm4.h>
#include "interrupt.h"

#include "../task/task.h"

/**
 * 初始化中断与异常处理程序。
 *
 * 这包括了设置 NVIC 和若干异常的优先级等等操作，
 * 需要在时钟初始化前调用。
 *
 * @invokeBefore clock_init()
 *
 * @kernelOnly
 */
void interrupt_init() {
	// TODO: 更复杂的中断优先级设定？
	// 系统计数器具有高优先级
	NVIC_SetPriority(SysTick_IRQn, 0x00u);
	// 可挂起系统中断具有最低优先级
	NVIC_SetPriority(PendSV_IRQn, 0xffu);
}

/**
 * 关闭所有中断，异常不受影响。
 */
void interrupt_disable() {
	__asm volatile ("CPSID I");
}

/**
 * 打开所有中断，异常不受影响。
 */
void interrupt_enable() {
	__asm volatile ("CPSIE I");
}
